# R   Value
# I - 1
# V - 5
# X - 10
# L - 50
# C - 100
# D - 500
# M - 1000

# 通用的构建罗马数字的规则
# 大的写在前面，小的写在后面
# XII - 12
# VII - 7
# XXVII - 27

# 特殊的规则
# 规则1
# I 可以放在 V 和 X 的前面：IV 和 IX，4 和 9
# 规则2
# X 可以放在 L 和 C 的前面：XL 和 XC，40 和 90
# 规则3
# C 可以放在 D 和 M 的前面：CD 和 CM，400 和 900
# 当处理这三个特殊的规则时，我们要做减法，用大数 - 小数

# 返回 s 表示的罗马数字对应的十进制数字
# romanToInteger("XXVII") -> 27
# romanToInteger("CD") -> 400

def romanToInteger(s):
  # Dictionary
  d = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
  value = 0 # 最终的转换结果

  i = 0
  while i < len(s):
    curr = d[s[i]] # 当前第 i 位的十进制数字

    # X X V I I
    #       i
    if i + 1 < len(s):
      # i 后面还有字符
      # 区分是一般规则，还是特殊规则
      nxt = d[s[i + 1]]

      if curr < nxt:
        # 特殊规则
        diff = nxt - curr
        value += diff

        i += 2
      else:
        # 一般规则
        value += curr
        i += 1
    else:
      # i 是最后一个字符
      value += curr
      i += 1

  return value

print(romanToInteger("CD"))
